<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/1/3
 * Time: 16:16
 */
//php生成唯一会员卡号,生成一个10位的会员ID
//将10进制转化为36进制
class Code{
    //密码字典
    //定义私有变量36进制
    private $dic=array(
        0=>'0',    1=>'1', 2=>'2', 3=>'3', 4=>'4', 5=>'5', 6=>'6', 7=>'7', 8=>'8',
        9=>'9', 10=>'A',  11=>'B', 12=>'C', 13=>'D', 14=>'E', 15=>'F',  16=>'G',  17=>'H',
        18=>'I',19=>'J',  20=>'K', 21=>'L',  22=>'M',  23=>'N', 24=>'O', 25=>'P', 26=>'Q',
        27=>'R',28=>'S',  29=>'T',  30=>'U', 31=>'V',  32=>'W',  33=>'X', 34=>'Y', 35=>'Z'
    );
    //定义私有方法,将$int中的数选出转化为8位的36进制数
    public function encodeID($int,$format=8){
        $dics=$this->dic;
        $dnum=36;//进制数
        $arr=array();//初始化
        $loop=true;
        while ($loop){
            //bcmod(A,B),得到A除以B后的余数
            $arr[]=$dics[bcmod($int,$dnum)];
            $int=bcdiv($int,$dnum,0);//bcdiv表示$int除以$dnum后的余数,0可有可无，表示截取小数点后的位数，返回的值为字符串
            //判断$int的值
            if ($int==0){
                $loop=false;
            }
        }
        if (count($arr)<$format){
            $arr=array_pad($arr,$format,$dics[0]);//array_pad（）将指定的元素以一定的数量插入到数组中去
            return implode('',array_reverse($arr));
        }
    }

    //将36进制转化为10进制
    public function decodeID($ids){
        $dics=$this->dic;
        $dnum=36;//进制数
        //键值交换
        $dedic=array_flip($dics);//array_flip（），将键名与键值相互对换
        //去零
        $id=ltrim($ids,$dics[0]);//ltrim（）函数从字符串中移除字符串
        //反转
        $id=strrev($id);
        $v=0;
        for ($i = 0,$j = strlen($id);$i<$j; $i++){
            $v=bcadd(bcmul($dedic[$id{$i}],bcpow($dnum,$i,0),0),$v,0);
        }
        return $v;

//        for ($i = 0, $j = strlen($id); $i < $j; $i++) {
//            $v = bcadd(bcmul($dedic[$id {
//            $i }
//            ], bcpow($dnum, $i, 0), 0), $v, 0);
//        }
//        return $v;
    }
}
//调用函数
$code=new Code();
$code_no=$code->encodeID(888888,5);
$card_pre='755';//城市的编码
$card_vc=substr(md5($card_pre.$code_no),0,2);
$card_vc=strtoupper($card_vc);//将字符转转换为大写
//前3位城市编码，中间为
echo $card_pre.$code_no.$card_vc;